const fs = require("fs"); // node.js文件系统
const exec = require("child_process").exec; // 启动一个新进程，用来执行命令
const config = require("../templates"); // 引入定义好的基础项目列表
const chalk = require("chalk"); // 给提示语添加色彩
const clear = require("clear"); // 清除命令
const figlet = require("figlet"); // 可以用来定制CLI执行时的头部
const inquirer = require("inquirer"); // 提供交互式命令行
const handlebars = require("handlebars"); // 一种简单的模板语言，可以自行百度一下
const clui = require("clui"); // 提供等待的状态
const Spinner = clui.Spinner;
const status = new Spinner("正在下载...");
const removeDir = require("../lib/remove"); // 用来删除文件和文件夹

module.exports = () => {
  let gitUrl;
  let branch;
  clear();
  // 定制酷炫CLI头部
  console.log(
    chalk.yellow(
      figlet.textSync("WEB-CLI", {
        horizontalLayout: "full",
      })
    )
  );
  inquirer
    .prompt([
      {
        name: "templateName",
        type: "list",
        message: "请选择你需要的项目模板：",
        choices: Object.keys(config.templates),
      },
      {
        name: "projectName",
        type: "input",
        message: "请输入你的项目名称：",
        validate: function (value) {
          if (value.length) {
            return true;
          } else {
            return "请输入你的项目名称";
          }
        },
      },
    ])
    .then((answers) => {
      gitUrl = config.templates[answers.templateName].url;
      branch = config.templates[answers.templateName].branch;
      // 执行的命令，从git上克隆想要的项目模板
      let cmdStr = `git clone ${gitUrl} ${answers.projectName} && cd ${answers.projectName} && git checkout ${branch}`;
      status.start();
      exec(cmdStr, (error, stdou, stderr) => {
        status.stop();
        if (error) {
          console.log("发生了一个错误：", chalk.red(JSON.stringify(error)));
          process.exit();
        }
        const meta = {
          name: answers.projectName,
        };
        // 这里需要注意：项目模板的 package.json 中的 name 要写成 "name": "{{name}}"的形式
        const content = fs
          .readFileSync(`${answers.projectName}/package.json`)
          .toString();
        // 利用handlebars.compile来进行 {{name}} 的填写
        const result = handlebars.compile(content)(meta);
        fs.writeFileSync(`${answers.projectName}/package.json`, result);
        // 删除模板自带的 .git 文件
        removeDir(`${answers.projectName}/.git`);
        console.log(chalk.green("\n √ 下载完成!"));
        console.log(chalk.cyan(`\n cd ${answers.projectName} && npm install \n`));
        process.exit();
      });
    })
    .catch((error) => {
      console.log(error);
      console.log("发生了一个错误：", chalk.red(JSON.stringify(error)));
      process.exit();
    });
};
